#include "operacionesRaid.h"

/*para encolar las peticiones del RAID*/
void encolarPeticiones(t_peticion *peticion, t_list *peticiones){
    collection_list_add(peticiones,peticion);
}

/*sacar la peticion encolada de la cola Raid Y DISTRIBUIR*/
void inicializarDistribucion(){
	pthread_t hiloDisribucion;
	if(pthread_create (&hiloDisribucion, NULL, (void*)sacarPeticiones, NULL)){
		printf("ERROR");/*logear!*/
	}
}

void *sacarPeticiones(){
	t_list *peticiones = getListaPeticionesPendientes();

	t_peticion *peticion = collection_list_remove(peticiones,0);

	if(peticion->tipoPeticion == Lectura || peticion->tipoPeticion == LecturaSincro){
		/*Es una lectura*/
		distribuirPeticionPPD_read(peticion, tablaDisco);/*es puntero a peticion?*/
	}else if (peticion->tipoPeticion == Escritura || peticion->tipoPeticion == EscrituraSincro){
		/*Es una escritura*/
		distribuirPeticionPPD_write(peticion, tablaDisco);
	}else if (peticion->tipoPeticion == FinSincro){
		distribuirPeticionFinSincro(peticion, tablaDisco);
	}
	return NULL;
}

void distribuirPeticionPPD_read(t_peticion *peticion, t_list *tablaDisco){

	/*Recorrer tabla de disco y seleccionar:
	 *      -El que menos peticiones tenga.*/

	t_infoDisco *discoSelect = seleccionarDiscoAAsignarPet(tablaDisco,peticion);

	agregarPeticionACola(discoSelect->colaPendientesPetDisco, peticion, discoSelect);

}

void distribuirPeticionPPD_write(t_peticion *peticion, t_list *tablaDisco){

    int cant=0;
    int indexDisco = 0;

    if (peticion->flagSincro ==1){
    while (indexDisco <= collection_list_size(tablaDisco)){

		t_infoDisco *discoSelect = (t_infoDisco*)collection_list_get(tablaDisco,indexDisco);
			if (discoSelect->estado==Sincronizando){
				agregarPeticionACola(discoSelect->colaPendientesPetDisco, peticion, discoSelect->idDisco);
				indexDisco++;
			}
		}
    }else{
        while (cant <= collection_list_size(tablaDisco)){

            t_infoDisco *discoSelect = (t_infoDisco*)collection_list_get(tablaDisco,cant);
			agregarPeticionACola(discoSelect->colaPendientesPetDisco, peticion, discoSelect->idDisco);
			cant++;
			discoSelect->sectoresCopiados = buscarSectorMaximo(peticion);
        }
    }

	printf("Se ha efectuado una escritura en todos los discos");
}

int buscarSectorMaximo(t_peticion *peticion){
	
	if (max < (peticion->sPayload->nSector)) {
		max = peticion->sPayload->nSector;
	}

		return max;
}

void distribuirPeticionFinSincro(t_peticion *peticion, t_list *tablaDisco){
	int indexDisco = 0;

	while (indexDisco <= collection_list_size(tablaDisco)){

		t_infoDisco *discoSelect = (t_infoDisco*)collection_list_get(tablaDisco,indexDisco);
		if (discoSelect->estado==Sincronizando ){
			agregarPeticionACola(discoSelect->colaPendientesPetDisco, peticion, discoSelect->idDisco);
			indexDisco++;
		}
	}
}
